查看原文
其他

Spring Boot构建RESTful API与单元测试

2017-08-01 翟永超 程序猿DD

《Spring Boot基础教程》系列文章微信公众号【复刻版】,所有内容都可在我的博客查阅,点击最下方的阅读原文可跳转至我的博客:http://blog.didispace.com


首先,回顾并详细说明一下在快速入门中使用的 @Controller@RestController@RequestMapping注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容。

  • @Controller:修饰class,用来创建处理http请求的对象

  • @RestController:Spring4之后加入的注解,原来在 @Controller中返回json需要 @ResponseBody来配合,如果直接用 @RestController替代 @Controller就不需要再配置 @ResponseBody,默认返回json格式。

  • @RequestMapping:配置url映射

下面我们尝试使用Spring MVC来实现一组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参、如何编写单元测试。

* RESTful API具体设计如下:*

User实体定义:

  1. public class User {

  2.    private Long id;

  3.    private String name;

  4.    private Integer age;

  5.    // 省略setter和getter

  6. }

实现对User对象的操作接口

  1. @RestController

  2. @RequestMapping(value="/users")     // 通过这里配置使下面的映射都在/users下

  3. public class UserController {

  4.    // 创建线程安全的Map

  5.    static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());

  6.    @RequestMapping(value="/", method=RequestMethod.GET)

  7.    public List<User> getUserList() {

  8.        // 处理"/users/"的GET请求,用来获取用户列表

  9.        // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递

  10.        List<User> r = new ArrayList<User>(users.values());

  11.        return r;

  12.    }

  13.    @RequestMapping(value="/", method=RequestMethod.POST)

  14.    public String postUser(@ModelAttribute User user) {

  15.        // 处理"/users/"的POST请求,用来创建User

  16.        // 除了@ModelAttribute绑定参数之外,还可以通过@RequestParam从页面中传递参数

  17.        users.put(user.getId(), user);

  18.        return "success";

  19.    }

  20.    @RequestMapping(value="/{id}", method=RequestMethod.GET)

  21.    public User getUser(@PathVariable Long id) {

  22.        // 处理"/users/{id}"的GET请求,用来获取url中id值的User信息

  23.        // url中的id可通过@PathVariable绑定到函数的参数中

  24.        return users.get(id);

  25.    }

  26.    @RequestMapping(value="/{id}", method=RequestMethod.PUT)

  27.    public String putUser(@PathVariable Long id, @ModelAttribute User user) {

  28.        // 处理"/users/{id}"的PUT请求,用来更新User信息

  29.        User u = users.get(id);

  30.        u.setName(user.getName());

  31.        u.setAge(user.getAge());

  32.        users.put(id, u);

  33.        return "success";

  34.    }

  35.    @RequestMapping(value="/{id}", method=RequestMethod.DELETE)

  36.    public String deleteUser(@PathVariable Long id) {

  37.        // 处理"/users/{id}"的DELETE请求,用来删除User

  38.        users.remove(id);

  39.        return "success";

  40.    }

  41. }

下面针对该Controller编写测试用例验证正确性,具体如下。当然也可以通过浏览器插件等进行请求提交验证。

  1. @RunWith(SpringJUnit4ClassRunner.class)

  2. @SpringApplicationConfiguration(classes = MockServletContext.class)

  3. @WebAppConfiguration

  4. public class ApplicationTests {

  5.    private MockMvc mvc;

  6.    @Before

  7.    public void setUp() throws Exception {

  8.        mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();

  9.    }

  10.    @Test

  11.    public void testUserController() throws Exception {

  12.        // 测试UserController

  13.        RequestBuilder request = null;

  14.        // 1、get查一下user列表,应该为空

  15.        request = get("/users/");

  16.        mvc.perform(request)

  17.                .andExpect(status().isOk())

  18.                .andExpect(content().string(equalTo("[]")));

  19.        // 2、post提交一个user

  20.        request = post("/users/")

  21.                .param("id", "1")

  22.                .param("name", "测试大师")

  23.                .param("age", "20");

  24.        mvc.perform(request)

  25.                .andExpect(content().string(equalTo("success")));

  26.        // 3、get获取user列表,应该有刚才插入的数据

  27.        request = get("/users/");

  28.        mvc.perform(request)

  29.                .andExpect(status().isOk())

  30.                .andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"测试大师\",\"age\":20}]")));

  31.        // 4、put修改id为1的user

  32.        request = put("/users/1")

  33.                .param("name", "测试终极大师")

  34.                .param("age", "30");

  35.        mvc.perform(request)

  36.                .andExpect(content().string(equalTo("success")));

  37.        // 5、get一个id为1的user

  38.        request = get("/users/1");

  39.        mvc.perform(request)

  40.                .andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}")));

  41.        // 6、del删除id为1的user

  42.        request = delete("/users/1");

  43.        mvc.perform(request)

  44.                .andExpect(content().string(equalTo("success")));

  45.        // 7、get查一下user列表,应该为空

  46.        request = get("/users/");

  47.        mvc.perform(request)

  48.                .andExpect(status().isOk())

  49.                .andExpect(content().string(equalTo("[]")));

  50.    }

  51. }

至此,我们通过引入web模块(没有做其他的任何配置),就可以轻松利用Spring MVC的功能,以非常简洁的代码完成了对User对象的RESTful API的创建以及单元测试的编写。其中同时介绍了Spring MVC中最为常用的几个核心注解: @Controller, @RestController, RequestMapping以及一些参数绑定的注解: @PathVariable, @ModelAttribute, @RequestParam等。

长按指纹

一键关注

好书推荐            

点击“阅读原文”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存